home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Src / submit / auth_logs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.9 KB  |  307 lines

  1. /* auth_logs.c: Prints out the authorisation logging info */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Src/submit/RCS/auth_logs.c,v 6.0 1991/12/18 20:28:02 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Src/submit/RCS/auth_logs.c,v 6.0 1991/12/18 20:28:02 jpo Rel $
  9.  *
  10.  * $Log: auth_logs.c,v $
  11.  * Revision 6.0  1991/12/18  20:28:02  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "q.h"
  20. #include "dr.h"
  21. #include <isode/cmd_srch.h>
  22.  
  23.  
  24. #define gval(x)                 ((x -> ad_type) == AD_X400_TYPE ? \
  25.                                         (x -> ad_r400adr) : (x -> ad_r822adr))
  26.  
  27. /* -- externals -- */
  28. extern CMD_TABLE    authtbl_statmsgs[];
  29. extern int        auth_loglev;
  30. extern UTC        utclocalise ();
  31.  
  32. /* -- local routines -- */
  33. void            auth_log();
  34. static int        auth_isdr();
  35. static int        auth_isgood();
  36. static void        gen_auth_logs();
  37. static void        gen_auth_notok();
  38. static void        gen_auth_ok();
  39. static void        gen_auth_stats();
  40. static void        wr2statfile();
  41. static void        wrdr2statfile();
  42. static void        wrmsg2statfile();
  43. static void        logfailure ();
  44.  
  45.  
  46.  
  47. /* -------------------  Begin  Routines  ------------------------------------ */
  48.  
  49.  
  50.  
  51.  
  52. void auth_log(qp, sender, recip, msgname)
  53. Q_struct *qp;
  54. ADDR    *sender;
  55. ADDR    *recip;
  56. char *msgname;
  57. {
  58.         ADDR    *ad;
  59.  
  60.         PP_TRACE (("auth_log()"));
  61.  
  62.         for (ad = recip; ad; ad = ad->ad_next)
  63.                 gen_auth_logs (qp, sender, ad, msgname);
  64. }
  65.  
  66.  
  67.  
  68.  
  69. /* ----------------------------- Logging ------------------------------------ */
  70.  
  71.  
  72.  
  73.  
  74.  
  75. static void gen_auth_logs (qp, sender, ad, msgname)
  76. Q_struct *qp;
  77. ADDR   *sender, *ad;
  78. char *msgname;
  79. {
  80.     LIST_RCHAN    *lp;
  81.     int        retval = NOTOK;
  82.  
  83.     PP_TRACE (("gen_auth_logs(%s)", gval(ad)));
  84.  
  85.     for (lp = ad -> ad_outchan; lp != NULLIST_RCHAN; lp = lp -> li_next)
  86.         if ((retval = auth_isgood (lp)) == OK)
  87.             break; 
  88.  
  89.     gen_auth_stats (qp, sender, ad, retval, msgname);
  90. }
  91.  
  92.  
  93.  
  94.  
  95. static void gen_auth_stats (qp, sender, ad, result, msgname)
  96. Q_struct *qp;
  97. ADDR    *sender, *ad;
  98. int     result;
  99. char *msgname;
  100. {
  101.  
  102.     PP_TRACE (("gen_auth_stats '%d' '%s'", result, gval (ad)));
  103.  
  104.     switch (result) {
  105.     case OK: 
  106.         gen_auth_ok (qp, sender, ad, msgname);
  107.         break;
  108.     default:
  109.         gen_auth_notok (sender, ad);
  110.         break;
  111.     }
  112. }
  113.  
  114.  
  115.  
  116.  
  117. static void gen_auth_ok (qp, sender, ad, msgname)
  118. Q_struct *qp;
  119. ADDR    *sender;
  120. ADDR    *ad;
  121. char *msgname;
  122. {
  123.     LIST_RCHAN    *lp = ad -> ad_outchan;
  124.  
  125.     PP_TRACE (("gen_auth_ok '%s'", gval (ad)));
  126.  
  127.     wr2statfile (qp, sender, ad, lp, msgname);
  128. }
  129.  
  130. static void gen_auth_notok (sender, ad)
  131. ADDR    *sender;
  132. ADDR    *ad;
  133. {
  134.     LIST_RCHAN    *lp = ad -> ad_outchan;
  135.  
  136.     PP_TRACE (("gen_auth_notok '%s'", gval (ad)));
  137.  
  138.     switch (auth_loglev) {
  139.     default:
  140.     case AUTH_LOGLEVEL_LOW:
  141.         if (lp != NULLIST_RCHAN)
  142.             logfailure (sender, ad, lp);
  143.         return;
  144.  
  145.     case AUTH_LOGLEVEL_MEDIUM:
  146.     case AUTH_LOGLEVEL_HIGH:
  147.         for (; lp != NULLIST_RCHAN; lp = lp -> li_next)
  148.             logfailure (sender, ad, lp);
  149.         return;
  150.     }
  151. }
  152.  
  153. static int auth_isgood (lp)
  154. LIST_RCHAN    *lp;
  155. {
  156.     if (lp == NULLIST_RCHAN)
  157.         return FALSE; 
  158.  
  159.     switch (lp -> li_auth -> status) {
  160.     case AUTH_OK:
  161.     case AUTH_DR_OK:
  162.     case AUTH_FAILED_TEST: 
  163.         return OK;
  164.     default:
  165.         return NOTOK;
  166.     }
  167. }
  168.  
  169. static int auth_isdr (lp)
  170. LIST_RCHAN    *lp;
  171. {
  172.     if (lp == NULLIST_RCHAN)
  173.         return FALSE; 
  174.  
  175.     switch (lp -> li_auth -> status) {
  176.     case AUTH_DR_OK:
  177.     case AUTH_DR_FAILED:
  178.         return OK;
  179.     }
  180.     return NOTOK;
  181. }
  182.  
  183. static void wr2statfile (qp, sender, ad, lp, msgname)
  184. Q_struct *qp;
  185. ADDR    *sender;
  186. ADDR    *ad;
  187. LIST_RCHAN    *lp;
  188. char *msgname;
  189. {
  190.     int    oldType;
  191.  
  192.     oldType = sender->ad_type;
  193.     if (qp && qp -> inbound && qp -> inbound -> li_chan)
  194.         sender->ad_type = qp -> inbound -> li_chan -> ch_in_ad_type;
  195.  
  196.     if (auth_isdr (lp) == OK)
  197.         wrdr2statfile (qp, sender, ad, lp, msgname);
  198.     else 
  199.         wrmsg2statfile (qp, sender, ad, lp, msgname);
  200.     sender->ad_type=oldType;
  201. }
  202.  
  203. static void wrmsg2statfile (qp, sender, ad, lp, msgname)
  204. Q_struct *qp;
  205. ADDR        *sender;
  206. ADDR        *ad;
  207. LIST_RCHAN    *lp;
  208. char *msgname;
  209. {
  210.     AUTH    *au = lp -> li_auth;
  211.     char    *cp;
  212.     char     *argv[100];
  213.     int    argc;
  214.     char    midbuf[BUFSIZ];
  215.     char    buffer[BUFSIZ];
  216.     char    tbuf[BUFSIZ];
  217.     char    sizebuf[30];
  218.     static char eq[] = "=";
  219.     PP_TRACE (("submit/wrmsg2statfile ('%s')", au -> reason));
  220.  
  221.  
  222.     cp = rcmd_srch (au -> status, authtbl_statmsgs);
  223.  
  224.     if (cp == NULLCP)
  225.         cp = rcmd_srch (AUTH_FAILED, authtbl_statmsgs);
  226.  
  227.     argc = 0;
  228.     argv[argc++] = cp;
  229.     argv[argc++] = msgname;
  230.  
  231.     argv[argc++] = qp -> inbound -> li_chan -> ch_name;
  232.     argv[argc++] = "->";
  233.     argv[argc++] = au -> chan -> li_chan -> ch_name;
  234.  
  235.     argv[argc++] = eq;
  236.     argv[argc++] = "p1msgid";
  237.     (void) msgid2rfc_aux (&qp->msgid, midbuf, FALSE);
  238.     argv[argc++] = midbuf;
  239.  
  240.     argv[argc++] = eq;
  241.     argv[argc++] = "size";
  242.     (void) sprintf (sizebuf, "%d", qp -> msgsize);
  243.     argv[argc++] = sizebuf;
  244.  
  245.     argv[argc++] = eq;
  246.     argv[argc++] = "sender";
  247.     argv[argc++] = gval (sender);
  248.     argv[argc++] = qp -> inbound -> li_mta;
  249.  
  250.     argv[argc++] = eq;
  251.     argv[argc++] = "recip";
  252.     argv[argc++] = gval (ad);
  253.     argv[argc++] = au -> mta -> li_mta;
  254.     argv[argc++] = au -> reason;
  255.  
  256.     argv[argc++] = eq;
  257.     argv[argc++] = "submit-time";
  258.     (void) strcpy (tbuf, "unknown");
  259.     if (qp -> trace != NULL &&
  260.         qp -> trace -> trace_DomSinfo.dsi_time) {
  261.         UTC ut = utclocalise (qp -> trace -> trace_DomSinfo.dsi_time);
  262.         if (ut) {
  263.             (void) sprintf (tbuf, "%d:%d:%d:%02d:%02d",
  264.                     ut -> ut_mon, ut -> ut_mday,
  265.                     ut -> ut_hour, ut -> ut_min,
  266.                     ut -> ut_sec);
  267.             free ((char *) ut);
  268.         }
  269.         
  270.     }
  271.     argv[argc++] = tbuf;
  272.  
  273.     argv[argc] = NULLCP;
  274.  
  275.     arg2vstr (0, sizeof buffer, buffer, argv);
  276.     PP_STAT (("%s", buffer));
  277. }
  278.  
  279. static void wrdr2statfile (qp, sender, ad, lp, msgname)
  280. Q_struct *qp;
  281. ADDR        *sender;
  282. ADDR        *ad;
  283. LIST_RCHAN    *lp;
  284. char *msgname;
  285. {
  286.     int sreason;
  287.  
  288.     PP_TRACE (("submit/wrdr2statfile ('%s')", lp -> li_auth -> reason));
  289.  
  290.     sreason = ad -> ad_reason;
  291.     ad -> ad_reason = DRR_NO_REASON;
  292.     (void) wr_dr_stat_log (qp, sender, ad, msgname, "transit");
  293.     ad -> ad_reason = sreason;
  294. }
  295.  
  296. static void logfailure (sender, ad, lp)
  297. ADDR        *sender;
  298. ADDR        *ad;
  299. LIST_RCHAN    *lp;
  300. {
  301.     PP_LOG (LLOG_EXCEPTIONS,
  302.         ("Message failed to %s (%s) from %s to %s: %s", lp -> li_mta,
  303.          lp -> li_chan -> ch_name, gval(sender), gval(ad),
  304.          lp -> li_auth -> reason));
  305. }
  306.  
  307.